#pragma once
#include "Property.hpp"
#include <entt/entt.hpp>
#include <string>
#include <memory>
#include <functional>

class Engine;

class Script {
public:
    virtual ~Script() = default;
    
    // 生命周期方法
    virtual void OnCreate() {}    // 当脚本被创建时调用
    virtual void OnStart() {}     // 当游戏开始时调用，在OnCreate之后，在第一帧之前
    virtual void OnUpdate(float deltaTime) {}  // 每帧更新时调用
    virtual void OnDestroy() {}   // 当脚本被销毁时调用
    
    // 属性系统
    virtual std::vector<PropertyDescriptor> GetProperties() const { return {}; }
    virtual PropertyValue GetPropertyValue(const std::string& name) const;
    virtual void SetPropertyValue(const std::string& name, const PropertyValue& value);
    
    // 设置属性变更回调
    void SetPropertyChangedCallback(PropertyChangedCallback callback) {
        m_propertyChangedCallback = callback;
    }
    
    // 设置关联的实体和引擎
    void SetEntity(entt::entity entity) { m_entity = entity; }
    void SetEngine(Engine* engine) { m_engine = engine; }
    
    // 获取关联的实体和引擎
    entt::entity GetEntity() const { return m_entity; }
    Engine* GetEngine() const { return m_engine; }
    
protected:
    // 属性存储
    std::map<std::string, PropertyValue> m_properties;
    
private:
    entt::entity m_entity = entt::null;
    Engine* m_engine = nullptr;
    PropertyChangedCallback m_propertyChangedCallback;
};